/*
 * @作者: 沙昊
 * @邮箱: shahao@zju.edu.cn
 * @功能: 
 * @包含算法: 
 * Copyright (c) 2023 by 沙昊, All Rights Reserved. 
 */
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

//默认的优先级队列是大顶堆，切换小顶堆,如果是比较单个数，则只需要指定第三个参数为std::greater<int>（小顶），否则需要定义cmp函数
//priority_queue<int, vector<int>, std::greater<int> > my_que;

/*
左队尾，右队首
struct cmp{
      在左边(也就是队尾),优先级越低
     * 默认使用less,小数在左边优先级越低
     * 可选greater,大数在左边优先级越低
     *
     * 大顶堆（右队首，左队尾）对应于 std::less<int>();
    bool operator ()(int a,int b){
        return a<b;//小的放左边,即less
    }
};

 * 小顶堆（右队首，左队尾）对应于 std::greater<int>;
struct cmp2{
    bool operator ()(int a,int b){
        return a>b;//大的放左边,即greater
    }
};
pair版
struct cmp2{
    bool operator ()(pair<int,int> a,pair<int,int> b){
        return a.second>b.second;//大的放左边,即greater
    }
};


但是对于sort来说，降序排列应该用  std::greater<int>，左大于右；std::sort(numbers.begin(), numbers.end(), std::greater<int>());
sort默认是升序；std::sort(numbers.begin(), numbers.end(), std::less<int>());

*/


vector<int> find_top_k_nums(vector<int>& nums, int k){
    vector<int> result;
    priority_queue<int, vector<int>, std::greater<int>> my_que(nums.begin(), nums.begin() + k);;
    for(int i=k; i<nums.size(); i++){
        if(nums[i]>=my_que.top()) my_que.push(nums[i]);
        if(my_que.size()>k) my_que.pop();
    }   
    while(!my_que.empty()){
        result.push_back(my_que.top());
        my_que.pop();
    }
    return result;
}


int main() 
{
	std::vector<int> arr;
	std::vector<int> res;
	int n, k, temp;
	std::cin >> n;
	for (int i = 0; i < n; i++) {
		std::cin >> temp;
		arr.push_back(temp);
	}
	std::cin >> k;
	res = findKthLargest(arr, k);
	//std::cout << res.size();
	for (int i = res.size() - 1; i >= 0; i--)
		std::cout << res[i] << std::endl;
}
